package com.jason.canvaslayer.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * @DESC:   canvas的旋转 save的使用
 * @Author: Jason
 * @Date: 16/9/26
 * @Time: 12:00
 *
 * canvas 的save()与saveLayer()区别:
 *          saveLayerXXX方法会将所有的操作存到一个新的Bitmap中而不影响当前Canvas的Bitmap,
 *          save方法是在当前的Bitmap中进行操作,并且只能针对Bitmap的形变和裁剪进行操作,
 *
 *
 * ALL_SAVE_FLAG:   标识保存所有
 * CLIP_SAVE_FLAG:  裁剪标识
 * CLIP_TO_LAYER_SAVE_FLAG:     只对saveLayer和saveLayerAlpha有效    表示对当前图层执行裁剪操作需要对对齐图层边界
 * FULL_COLOR_LAYER_SAVE_FLAG:  只对saveLayer和saveLayerAlpha有效    表示当前图层的色彩模式至少需要是8位色味
 * HAS_ALPHA_LAYER_SAVE_FLAG:   只对saveLayer和saveLayerAlpha有效    表示在当前图层中将需要使用逐像素Alpha混合模式
 * MATRIX_SAVE_FLAG:    变换标识位
 *
 *          除了CLIP_SAVE_FLAG、MATRIX_SAVE_FLAG和ALL_SAVE_FLAG是save()和saveLayerXXX方法都通用外其余三个只能使saveLayerXXX方法有效
 *
 *          所有的save、saveLayer和saveLayerAlpha方法都有一个int型的返回值,该返回值作为一个标识给与一个你当前保存操作的唯一ID编号,
 *          我们可以利用restoreToCount(int saveCount)方法来指定在还原的时候还原哪一个保存操作
 *
 */

public class LayerView2 extends View {

    private Paint mPaint;
    private int mViewWidth, mViewHeight;

    public LayerView2(Context context, AttributeSet attrs) {
        super(context, attrs);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mViewWidth = w;
        mViewHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 旋转画布
        // canvas(大多数Android中其他与坐标有关的) 进行坐标操作的时候,默认情况下是以控件的左上角为原点坐标的
        //canvas.rotate(30); 两个矩形都旋转

        // 绘制红色矩形
        mPaint.setColor(Color.RED);
        canvas.drawRect(mViewWidth / 2F - 200, mViewHeight / 2F - 200,
                mViewWidth / 2F + 200, mViewHeight / 2F + 200, mPaint);


        // 保存画布并绘制一个蓝色的矩形
        //canvas.save();
        //canvas.saveLayer(0, 0, mViewWidth, mViewHeight, null, Canvas.ALL_SAVE_FLAG);

        // 保存和蓝色方块一样的区域   这样图层大小就这么点 超出的部分就不能被显示,将画布旋转为5
        /*canvas.saveLayer(mViewWidth / 2F - 100, mViewHeight / 2F - 100,
                mViewWidth / 2F + 100, mViewHeight / 2F + 100, null, Canvas.ALL_SAVE_FLAG);*/

        // 设置画布的透明度
        canvas.saveLayerAlpha(mViewWidth / 2F - 100, mViewHeight / 2F - 100,
                mViewWidth / 2F + 100, mViewHeight / 2F + 100, 0x55, Canvas.ALL_SAVE_FLAG);

        mPaint.setColor(Color.BLUE);

        // 旋转画布
        //canvas.rotate(30);  // 只有蓝色的矩形旋转
        canvas.rotate(5);

        canvas.drawRect(mViewWidth / 2F - 100, mViewHeight / 2F - 100,
                mViewWidth / 2F + 100, mViewHeight / 2F + 100, mPaint);
        canvas.restore();


    }
}
